/*
 * UserManager.cpp
 *
 *  Created on: Nov 11, 2013
 *      Author: ruben
 */

#include "UserManager.h"
#include "../Entities/User.h"

UserManager::UserManager() {}

UserManager::~UserManager() {}

int UserManager::crear(BigInt dni, const String& name, const String& lastName, const String& email, const String& password, const String& province, char type) {
	User nuevo(dni, name, lastName, password, province, type);
	nuevo.getEmails().push_back(email);
	indice.agregarAlHash(nuevo);
	indice.agregarAlIndiceTipoUsuario(nuevo);
	indice.agregarAlIndiceProvincia(nuevo);
	return 0;
}

int UserManager::eliminar(BigInt id){
	User recuperado;
	indice.recuperarDelHash(id, recuperado);
	indice.eliminarDelIndiceTipoUsuario(recuperado.getType(), id);
	indice.eliminarDelIndiceProvincia(recuperado.getProvince(), id);
	indice.eliminarDelHashUsuario(id);
	return 0;
}

int UserManager::modificar(BigInt idBuscado, const String& name, const String& lastName, const String& email, const String& password, const String& province) {
	User recuperado;
	indice.recuperarDelHash(idBuscado, recuperado);
	char type = recuperado.getType();
	String prov = recuperado.getProvince();

	indice.eliminarDelHashUsuario(idBuscado);
	indice.eliminarDelIndiceTipoUsuario(type, idBuscado);
	indice.eliminarDelIndiceProvincia(prov, idBuscado);

	crear(idBuscado, name, lastName, email, password, province, type);
	return 0;
}

int UserManager::buscarIDyVerificarDatos(BigInt identifier, const String& pass) {
	User recuperado;
	if ( !indice.recuperarDelHash(identifier, recuperado))
		//Usuario inexistente
		return -1;
	if( recuperado.getType() == USER )
		return 0;
	if( recuperado.getType() == PROVEEDOR )
		return 1;
	return 2;//es admin
}

int UserManager::buscarIDyVerificarTipo(BigInt identifier, const String& pass, int type) {
	// recuperar USER por ID y luego verificar sus datos.
	User recuperado;
	if (!indice.recuperarDelHash(identifier, recuperado))
		return -1;
	if (recuperado.getPassword() == pass && recuperado.getType() == type)
		return 1;
	return -1; //ERROR DE DATOS
}

int UserManager::crearUsuarioAdmin(BigInt id) {
	User recuperado;
	if( !indice.recuperarDelHash(id, recuperado) )
		//Usuario inexistente
		return -1;
	indice.eliminarDelHashUsuario(recuperado.getDni());
	recuperado.setType(ADMIN);
	indice.agregarAlHash(recuperado);
	return 1;
}

int UserManager::eliminarUsuarioAdmin(BigInt id) {
	User recuperado;
	if( !indice.recuperarDelHash(id, recuperado) )
		//Usuario inexistente
		return -1;
	indice.eliminarDelHashUsuario(recuperado.getDni());
	recuperado.setType(USER);
	indice.agregarAlHash(recuperado);
	return 1;
}

int UserManager::recuperarPassword(BigInt id, String& password) {
	User recuperado;
	if( !indice.recuperarDelHash(id, recuperado) )
		//Usuario inexistente
		return -1;
	password = recuperado.getPassword();
	return 0;
}
